package com.xu.GOF23.single;

import java.lang.reflect.Constructor;

public class reflectBreakSolution {
    private reflectBreakSolution() {
        //当一个调用getInstance来通过构造器创建，一个通过反射创建 解决办法
        synchronized (reflectBreakSolution.class) {
            if (LazyManDead != null) {
                throw new RuntimeException("不要试图使用反射来破坏异常");
            }
        }

        System.out.println("当前线程" + Thread.currentThread().getName() + "进入构造器创建对象");
    }

    private volatile static reflectBreakSolution LazyManDead;

    public static reflectBreakSolution getInstance() {
        if (LazyManDead == null) {//隔离除了第一次调用以外的调用，提高效率
            synchronized (reflectBreak.class) {
                if (LazyManDead == null) {
                    LazyManDead = new reflectBreakSolution();
                }
            }
        }
        return LazyManDead;
    }

    public static void main(String[] args) throws Exception {
        reflectBreakSolution lazyMan1 = reflectBreakSolution.getInstance();//通过调用方法创建一个 懒汉1
        //通过反射创建
        Constructor<reflectBreakSolution> declaredConstructor = reflectBreakSolution.class.getDeclaredConstructor(null);//传入null 即得到一个空参构造器
        declaredConstructor.setAccessible(true);
        //setAccessible(true)这个是为了强行获得构造器的访问权限，比如说单例模式的类的构造器是私有的，你需要通过反射实例一个对象，就必须要有这一句，否则会引发非法访问权限异常
        reflectBreakSolution lazyMan2 = declaredConstructor.newInstance();
        System.out.println(lazyMan1);
        System.out.println(lazyMan2);

    }
}
